home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ccdl151s.zip / SOURCE / CONF386.C < prev    next >
C/C++ Source or Header  |  1997-06-15  |  5KB  |  156 lines

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. #include <stdio.h>
  23. #include    "expr.h"
  24. #include     "c.h"
  25. extern int prm_packing, prm_68020;
  26. extern long framedepth, lc_maxauto;
  27. extern int prm_linkreg;
  28.  
  29. char PROGNAME[]="CC386";
  30. char ENVNAME[]="CC386";
  31. char SOURCEXT[]=".ASM";
  32. char GLBDEFINE[]="_i386_";
  33.  
  34. #ifdef BRIEFHELP
  35. char *usage_text = "[+e/+i/f+l/w+A/C/D/E/I/O] file list";
  36. #else
  37. char *usage_text = "[options] files\n"
  38. "+e     - dump errors to file        /fname - specify parameter file\n"
  39. "+i     - dump preprocessed file     +l     - dump listing file\n"
  40. "/fname - specify parameter file     +l     - dump listing file\n"
  41. "/w-xxx - disable a warning          +A     - disable extensions\n"
  42. "/C     - codegen parameters         /Dxxx  - define something\n"
  43. "/Enn   - max number of errors       /Ipath - specify include path\n"
  44. "/O     - optimzer parameters\n"
  45. "Codegen parameters: (/C[+][-][params])\n"
  46. "  +d   - display diagnostics        -b     - no BSS\n"
  47. "  -l   - no C source in ASM file    -m     - no leading underscores\n"
  48. "  +r   - reverse order of bit ops   +F     - FLAT model\n"
  49. "  +N   - generate NASM code         -R     - no link register\n"
  50. "Optimizer parameters (/O[+][-][params])\n"
  51. "  -A   - no address register optimizations\n"
  52. "  -D   - no data register optimizations\n"
  53. "  -F   - no fp register optimizations\n";
  54. #endif                                    
  55. int prm_flat = FALSE;
  56. int prm_nasm = 0;
  57. int cf_maxaddress =20;
  58. int cf_maxdata=4;
  59. int cf_freeaddress =1;
  60. int cf_freedata=3;
  61. int cf_freefloat=3;
  62. int stackadd = 3;
  63. int stackmod = -4;
  64. int strucadd = 3;
  65. int strucmod = -4;
  66. int stdretblocksize = 8;
  67. int stdinttype = bt_long;
  68. int stdunstype = bt_unsigned;
  69. int stdintsize = 4;
  70. int stdldoublesize = 10;
  71. int stdaddrsize = 4;
  72. int regdsize = 4;
  73. int regasize = 4;
  74. int regfsize = 10;
  75.  
  76. extern TYP stdchar;
  77. TYP             stdconst = { bt_long, 1, UF_DEFINED, 0, 0, -1, -1, 4, {0, 0}, 0, "stdconst",0};
  78. TYP             stdstring = {bt_pointer, 0, 0,0,0,-1, -1, 4, {0, 0}, &stdchar, 0,0};
  79. TYP             stdint = { bt_long, 0, UF_DEFINED | UF_USED,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  80. TYP                            stdlongdouble = {bt_longdouble,0,0,0,0,-1,-1,10,{0,0},0,0,0 };
  81. TYP             stduns = { bt_unsigned, 0, 0,0, 0,-1, -1, 4, {0, 0}, 0, 0,0 };
  82. KEYWORDS prockeywords[] = {
  83.                 {0,"_absolute", kw__abs}, { 0, "pascal", kw__pascal },
  84.                 {0,"_interrupt", kw__interrupt},{0,"_genbyte", kw__genword },
  85.                 {0,"_EAX", kw_D0}, {0,"_ECX", kw_D1},{0,"_EDX", kw_D2},
  86.                 {0,"_EBX", kw_D3},{0,"_ESP", kw_D4},{0,"_EBP", kw_D5},
  87.                 {0,"_ESI", kw_D6},{0,"_EDI", kw_D7},
  88.         {0, 0, 0} };
  89.  
  90. char *registers[] = { "EAX","ECX","EDX","EBX","ESP","EBP","ESI","EDI",
  91. "","","","","","","","",
  92. "ESP","EBP","ESI","EDI" };
  93.  
  94. int confcodegen(char s, int bool)
  95. {
  96.     switch (s) {
  97.                     case 'N':
  98.                         prm_nasm = bool;
  99.                         break;
  100.                     case 'F':
  101.                         prm_flat = bool;
  102.                         break;
  103.                     default:
  104.                         return 0;
  105.     }
  106.     return 1;
  107. }
  108. void confsetup(void)
  109. {
  110.     if (prm_linkreg)
  111.         cf_freeaddress = 2;
  112.     else
  113.         cf_freeaddress = 1;
  114. }
  115. int     alignment(int type, TYP *tp)
  116. {       switch(tp->type) {
  117.                 case bt_char: case bt_unsignedchar:  return 1;
  118.                 case bt_short: case bt_unsignedshort: return 2;
  119.                 case bt_long: case bt_unsigned: return 4;
  120.                 case bt_enum:           return 2;
  121.                 case bt_pointer:
  122.                                 case bt_matchall:
  123.                         if(tp->val_flag)
  124.                                 return alignment(type,tp->btp);
  125.                         else
  126.                                 return 4;
  127.                 case bt_float:          return 4;
  128.                 case bt_double:         return 4;
  129.                                 case bt_longdouble:                return 4;
  130.                 case bt_struct:
  131.                 case bt_union:          return 4;
  132.                 default:                return 1;
  133.                 }
  134. }
  135. int getalign(int sc, TYP *tp)
  136. {
  137.    int align = alignment(sc,tp);
  138.                                                 if (sc != sc_auto) 
  139.                                                     if (prm_packing)
  140.                                                         align = 1;
  141.     return align;
  142. }
  143.  
  144. long getautoval(long val)
  145. {
  146.     if (prm_linkreg)
  147.         return val;
  148.     if (val >= 0) 
  149.         return framedepth+val;
  150.     else
  151.         return lc_maxauto + val;
  152. }
  153. funcvaluesize(int size)
  154. {
  155.         return 0;
  156. }